---
title: Mutations
description: Mutating Dinero objects through mathematical operations.
---

At the core of manipulating money are mutations. The Dinero.js API provides functions to manipulate objects. Most of them are calculus-based: adding, multiplying, etc.

```js
import { dinero, add } from 'dinero.js';
import { USD } from '@dinero.js/currencies';

const d1 = dinero({ amount: 500, currency: USD });
const d2 = dinero({ amount: 800, currency: USD });

add(d1, d2);
```

## Calculating new amounts

Any application that handles money needs to manipulate them. A classic example is a checkout page where you need to calculate the total, add shipping, subtract discounts, etc.

```js
import { dinero, add, allocate, subtract } from 'dinero.js';
import { USD } from '@dinero.js/currencies';

const products = [
  {
    name: 'Apple iPhone 12',
    price: dinero({ amount: 89900, currency: USD }),
  },
  {
    name: 'Apple AirPods Pro',
    price: dinero({ amount: 17495, currency: USD }),
  },
];

const subtotal = products.reduce(
  (acc, { price }) => add(acc, price),
  dinero({ amount: 0, currency: USD })
);

const [discount] = allocate(subtotal, [20, 80]);
const discounted = subtract(subtotal, discount);

const shipping = dinero({ amount: 1000, currency: USD });

const total = add(subtotal, shipping);
```

## Dinero objects are immutable

Even though such functions can be categorized as "mutations", **Dinero objects are immutable.** When you're using a mutation function, the existing objects remain intact.

```js
import { dinero, add, toSnapshot } from 'dinero.js';

// ...

toSnapshot(add(d1, d2));

// {
//   amount: 1300,
//   currency: {
//     code: 'EUR',
//     base: 10,
//     exponent: 2,
//   },
//   scale: 2,
// }

toSnapshot(d1);

// {
//   amount: 500,
//   currency: {
//     code: 'EUR',
//     base: 10,
//     exponent: 2,
//   },
//   scale: 2,
// }

toSnapshot(d2);

// {
//   amount: 800,
//   currency: {
//     code: 'EUR',
//     base: 10,
//     exponent: 2,
//   },
//   scale: 2,
// }
```
